


import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

/**
 * @date 2022/4/8
 * @desc
 * 先演示 把文件传到本地
 * 1.创建上传表单页面   注意上传文件的表单的属性
 * 2.添加上传组件的依赖 commons-fileupload
 * 3.在 servlet 中写上传的代码  这个代码能看懂   理解就好
 *
 * 再演示 把文件传到阿里云服务器    案例 在  test 下面   TestOss
 *
 * 1.开通oss
 * 2.理解几个名词    bucket   endpoint  等
 * 3.创建bucket
 * 4.准备 访问秘钥
 * 5.添加oss依赖
 * 6.测试案例   测试 文件流上传
 */
@WebServlet("/upload2")
public class UploadServlet2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 文件上传   这里借助  commons-fileupload

        // 注意  不能使用传统的方式 获取上传表单数据  自行验证

        // 使用上传组件的工厂对象
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // 得到上传文件的解析组件
        ServletFileUpload upload = new ServletFileUpload(factory);

        if(ServletFileUpload.isMultipartContent(req)){
            // 判断数据提交方式是不是上传表单提交的
            // 是上传表单就会进来
            System.out.println("是上传表单");

            try {
                //就是 解析出来的 上传的表单项集合     这个集合包含了普通表单项和上传文件表单项
                List<FileItem> fileItems = upload.parseRequest(req);

                for(FileItem item: fileItems){
                    // 遍历表单项集合
                    if(item.isFormField()){
                        //如果是普通表单项
                        String fieldName = item.getFieldName();
                        String value = item.getString();

                        //System.out.println(fieldName+"----"+value);

                    }else{
                        //处理上传表单项
                        //得到文件名
                        String name = item.getName();   // 这里可能存在文件差异  使用不同的浏览器时  需要注意

                        //System.out.println(name);

                        if(name==null || name.trim().equals("")){
                            // 没有选择文件    跳过  不接受
                            continue;
                        }

                        //把上传的表单项 转为输入流
                        InputStream inputStream = item.getInputStream();

                        //得到一个保存文件的路径 咱们当前是把文件保存在应用服务器
                        String realPath = this.getServletContext().getRealPath("/upload");

                        // 输出流指向 目的地
                        OutputStream fileOutputStream = new FileOutputStream(realPath+"\\"+name);

                        byte[] bytes = new byte[1024];
                        int len=0;
                        while ((len = inputStream.read(bytes))>0){
                            fileOutputStream.write(bytes,0,len);
                        }

                        inputStream.close();
                        fileOutputStream.close();


                    }
                }


            } catch (FileUploadException e) {
                e.printStackTrace();
            }

        }else{
            //不是上传表单
            System.out.println("不是上传表单");
        }
    }
}
